Technical Q&A QA1152
Using Navigation Services to filter QuickTime files


Q: é©ï™Çà QuickTime ëŒâûÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈ÉtÉHÉãÉ_ÉiÉrÉQÅ[ÉVÉáÉìã@î\ÅiNavigation ServicesÅjÇégǡǃǢNjÇ∑ÅBÉiÉrÉQÅ[ÉVÉáÉìÉTÅ[ÉrÉXÇÃÅm OpenÅiäJÇ≠ÅjÅnÉ_ÉCÉAÉçÉOÉ{ÉbÉNÉXÇ≈ QuickTime Ç™äJÇØÇÈÇ∑Ç◊ǃÇÃÉtÉ@ÉCÉãÇï\é¶Ç≥ÇπÇΩÇ¢ÇÃÇ≈Ç∑Ç™ÅAǪÇÃÇΩÇflÇÃä»íPÇ»ï˚ñ@ÇÕdžÇËÇ‹Ç∑Ç©ÅH

A: ÇÕÇ¢ÅAdžÇËÇ‹Ç∑ÅBQuickTime Çà CanQuickTimeOpenFile ä÷êîÇégǶnjÅAÉtÉ@ÉCÉãÇ™ÅA ÉOÉâÉtÉBÉbÉNÉXÉCÉìÉ|Å[É^ÇégǡǃNjÇΩÇÕǪÇÃNjNjÉÄÅ[ÉrÅ[ÇΔǵǃÅAQuickTime Ç…ÇÊÇËäJÇØÇÈǫǧǩÇí≤Ç◊ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅBÉAÉvÉäÉPÅ[ÉVÉáÉìíËã`ÇÃÉiÉrÉQÅ[ÉVÉáÉìÉTÅ[ÉrÉXÉtÉBÉãÉ^ä÷êîÇ©ÇÁDZÇà API ÇåƒÇ—èoÇ∑ÇæÇØÇ≈ÅAQuickTime Ç™äJÇØÇÈÉtÉ@ÉCÉãÇÃÇ∑Ç◊ǃÇï\é¶Ç≈Ç´Ç‹Ç∑ÅBà»â∫ÇÕÅAǪÇÃï˚ñ@Çé¶Ç∑ÉiÉrÉQÅ[ÉVÉáÉìÉTÅ[ÉrÉX ÉtÉBÉãÉ^ä÷êîÇÃó·Ç≈Ç∑ÅB



 OSStatus    GetFSSpecFromAEDesc( FSSpec *fsspec, AEDesc* theItem )
{
    OSStatus    err           = noErr;
    AEDesc      coerceDesc    = { NULL, NULL };
    AEDesc      coerceDesc2   = { NULL, NULL };
    FSSpec      fsSpec;


    /* AEDesc Ç™Ç‹Çæ FSSpec Ç≈ǻǢèÍçáÇÕÅAFSSpec Ç…ïœä∑Ç∑ÇÈ...  */
    if ( theItem->descriptorType != typeFSS )
    {
        err = AECoerceDesc( theItem, typeFSS, &coerceDesc2 );
        /* AEDesc Ç©ÇÁ FSSpec ÇéÊìæÇ∑ÇÈ */
        if ( err == noErr )
        {
            theItem = &coerceDesc2;
        }
    }
    err = AEGetDescData( theItem, fsspec, sizeof(fsSpec) );
    AEDisposeDesc( &coerceDesc2 );

    return( err );
}

pascal Boolean NavLaunchServicesFilterProc(
                                          AEDesc* theItem,
                                          void* info,
                                          NavCallBackUserData ioUserData,
                                          NavFilterModes filterMode
                                          )
{
    #pragma unused(ioUserData)
    NavFileOrFolderInfo    *myInfo      = (NavFileOrFolderInfo *)info;
    OSStatus                err         = noErr;
    Boolean                 showItem    = false;
    FSSpec                  fsspec;
    if ( filterMode == kNavFilteringBrowserList )
    {
        if (theItem->descriptorType == typeFSS)
        {
            /* ÉtÉ@ÉCÉãÇ‹ÇΩÇÕÉtÉHÉãÉ_ÇÃÇ«ÇøÇÁÇ©ÅH */
            if (myInfo->isFolder)
            {
                /* Ç∑Ç◊ǃÇÃÉtÉHÉãÉ_Çï\é¶ */
                showItem = true;
            }
            else    /* ÉtÉ@ÉCÉãÇÕdžÇÈÇ™ÉtÉHÉãÉ_ÇÕǻǢ */
            {
                Boolean outCanOpenWithGraphicsImporter    = false;
                Boolean outCanOpenAsMovie        = false;
                err = GetFSSpecFromAEDesc( &fsspec, theItem );
                if ( err != noErr ) goto BailWithError;
/*
CanQuickTimeOpenFile ä÷êîÇ…ä÷Ç∑ÇÈéQçlï∂å£ÇÅAñ{ï∂èëÇÃç≈å„Ç…é¶ÇµÇ‹Ç∑ÅB

ëŒè€ÉtÉ@ÉCÉãÇà FSSpec ÇìnÇ∑ÇæÇØÇ≈ÅAQuickTime ÇÕÅA
outCanOpenWithGraphicsImporter ÉpÉâÉÅÅ[É^ÇΔ outCanOpenAsMovie ÉpÉâÉÅÅ[É^ÇÃíÜÇ≈ÅA
ÉtÉ@ÉCÉãÇ™ÉOÉâÉtÉBÉbÉNÉXÉCÉìÉ|Å[É^ÇégǡǃÅAÇ‹ÇΩÇÕǪÇÃNjNjÉÄÅ[ÉrÅ[ÇΔǵǃ
äJÇØÇÈǩǫǧǩÇé¶Ç∑ílÇï‘ǵNjÇ∑ÅB

ì¡Ç…ãªñ°ê[Ç¢ÇÃÇÕÅAinFlags
ÉpÉâÉÅÅ[É^ÇΔǵǃìnÇπÇÈäeéÌÇÃÉtÉâÉOÇ≈Ç∑ÅB
DZÇÍÇÁÇÕÅAQuickTime ÇÃåüçıï˚ñ@Ç…âeãøÇó^ǶNjÇ∑ÅBéüÇ…äeéÌÉtÉâÉOÇÃÉäÉXÉgÇé¶ÇµÇ‹Ç∑ÅB

- inFlags íËêî -

kQTDontUseDataToFindImporter
DZÇÃÉtÉâÉOÇÕÅAÉtÉ@ÉCÉãíÜÇÃÉfÅ[É^ÇåüçıÇ…ÇÕóòópǵǻǢÇÊǧDž QuickTime Ç…éwé¶ÇµÇ‹Ç∑ÅB
DZÇÍÇ…ÇÊÇËÅAäJÇØÇÈÉtÉ@ÉCÉãǙǻǢÇΔǢǧåãâ Ç™ï‘Ç≥ÇÍÇÈèÍçáÇ…ÇÕì¡Ç…åüçıÇÃë¨ìxÇÕè„Ç™ÇËÇ‹Ç∑Ç™ÅA
QuickTime ÇÕÅAÉtÉ@ÉCÉãÉ^ÉCÉvÇ‚ÉtÉ@ÉCÉãägí£éqÇ≈îFéØÇ≈ǴǻǢÉtÉ@ÉCÉãÇ
äJÇØÇ»Ç¢ÇΔïÒçêÇ∑ÇÈDZÇΔÇ…Ç»ÇËÇ‹Ç∑ÅB


kQTDontLookForMovieImporterIfGraphicsImporterFound
DZÇÃÉtÉâÉOÇÕÅAÉtÉ@ÉCÉãÇäJÇ≠ï˚ñ@Ç™å©Ç¬Ç©Ç¡ÇΩéûì_Ç≈ÅA
QuickTime Ç…åüçıÇèIóπÇ∑ÇÈÇÊǧDžéwé¶ÇµÇ‹Ç∑ÅBÉtÉ@ÉCÉãÇ™ÅAÉOÉâÉtÉBÉbÉNÉXÉCÉìÉ|Å[É^Çégǡǃ
Ç‹ÇΩÇÕǪÇÃNjNjÉÄÅ[ÉrÅ[ÇΔǵǃäJÇØÇÈǩǫǧǩÇímÇËÇΩÇ¢èÍçáÅA
ǪǵǃǪÇÃï˚ñ@Çñ‚ÇÌǻǢèÍçáDžDZÇÃÉtÉâÉOÇìnǵNjÇ∑ÅB

kQTAllowOpeningStillImagesAsMovies
DZÇÃÉtÉâÉOÇÕÅAQuickTime Ç…ÅAê√é~âÊÇÉÄÅ[ÉrÅ[ÇΔǵǃäJÇ≠DZÇΔÇåüì¢Ç∑ÇÈÇÊǧDžéwé¶ÇµÇ‹Ç∑ÅB
DZÇÃÉtÉâÉOÇÉOÉâÉtÉBÉbÉNÉXÉCÉìÉ|Å[É^Ç≈äJÇØÇÈÇΔÇ´ÅA
QuickTime ÇÕé©ìÆìIÇ…ÅAÉtÉ@ÉCÉãÇÉÄÅ[ÉrÅ[ÇΔǵǃäJÇØÇÈÇΔïÒçêǵNjÇ∑ÅB

kQTAllowImportersThatWouldCreateNewFile
DZÇÃÉtÉâÉOÇÕÅAQuickTime Ç…ÅAêVǵǢÉtÉ@ÉCÉãÇçÏê¨Ç∑ÇÈÉCÉìÉ|Å[É^Çä‹ÇflÇÈÇÊǧDžéwé¶ÇµÇ‹Ç∑ÅB
DZÇÃÉtÉâÉOÇ™ÉNÉäÉAÇ≥ÇÍǃǢÇÈèÍçáÅA
QuickTime ÇÕÅAêVǵǢÉtÉ@ÉCÉãÇçÏê¨ÇµÇ»Ç≠ǃLJǪÇÃNjNj
ÉCÉìÉ|Å[ÉgÇ≈Ç´ÇÈÉCÉìÉ|Å[É^ÇÃÇ›Çä‹ÇflÇ‹Ç∑ÅB

kQTAllowAggressiveImporters
DZÇÃÉtÉâÉOÇÕÅAPICT Ç‚ TEXT ÇÃÇÊǧǻí ó·ÉÄÅ[ÉrÅ[ÇΔÇÕçlǶÇÁÇÍǻǢ
ÉtÉ@ÉCÉãÉ^ÉCÉvÇÃÇΩÇflÇ…ÉÄÅ[ÉrÅ[ÉCÉìÉ|Å[É^Çä‹ÇflÇÈÇÊǧDžéwé¶ÇµÇ‹Ç∑ÅB
DZÇÃÉtÉâÉOÇ™ÉNÉäÉAÇ≥ÇÍǃǢÇÈèÍçáÅA
QuickTime ÇÕÅADZÇÍÇÁÇÃÉÄÅ[ÉrÅ[ÉCÉìÉ|Å[É^ÇèúäOǵNjÇ∑ÅB

åüçıÇÃë¨ìxÇ™å¸è„Ç∑ÇÈÇÃÇ≈ÅAÉtÉ@ÉCÉãÇäJÇ≠ï˚ñ@Ç…Ç±ÇæÇÌÇÁǻǢèÍçáÇÕÅA
kQTDontLookForMovieImporterIfGraphicsImporterFound
ÉtÉâÉOÇÃégópÇêÑèßǵNjÇ∑ÅBèÛãµÇ…ÇÊǡǃÇÕÅAåüçıÇÃë¨ìxÇå¸è„Ç≥ÇπÇÈ 
kQTDontUseDataToFindImporter ÉtÉâÉOÇégǧÇÃÇ™ï÷óòǩLJǵÇÍÇ‹ÇπÇÒÇ™ÅA
åáì_ÇÕÅAägí£éqÇ‹ÇΩÇÕÉtÉ@ÉCÉãÉ^ÉCÉvÇîFéØÇ≈ǴǻǢÉtÉ@ÉCÉãÇÉXÉLÉbÉvǵǃǵNjǧDZÇΔÇ≈Ç∑ÅB
*/
                err = CanQuickTimeOpenFile(
                       &fsspec,
                           /* fileType */
                       myInfo->fileAndFolder.fileInfo.finderInfo.fdType,
                           /* ÉtÉ@ÉCÉãÇÃägí£éqÅAÇÌÇ©ÇÁǻǢèÍçáÇÕ 0  */
                       0,
                           /* ÉtÉ@ÉCÉãÇÉOÉâÉtÉBÉbÉNÉXÉCÉìÉ|Å[É^Ç≈äJÇØÇÈèÍçáÇÕ true Çï‘Ç∑                          Å@
                       &outCanOpenWithGraphicsImporter,
                           /* ÉtÉ@ÉCÉãÇÉÄÅ[ÉrÅ[ÉCÉìÉ|Å[É^Ç≈äJÇØÇÈèÍçáÇÕ true Çï‘Ç∑
                            */
                       &outCanOpenAsMovie,
                           /* ÉtÉ@ÉCÉãÇÉOÉâÉtÉBÉbÉNÉXÉCÉìÉ|Å[É^Ç‹ÇΩÇÕÉÄÅ[ÉrÅ[ÉCÉìÉ|Å[É^ÇÃ
                           Ç«ÇøÇÁÇ≈LJäJÇØÇÈèÍçáÇÕÅAtrue Çï‘Ç∑Ç™
                           QuickTime ÇÕÉOÉâÉtÉBÉbÉNÉXÉCÉìÉ|Å[É^ÇÃégópÇóDêÊÇ∑ÇÈ */
                       nil,
                           /* inFlags
                           QuickTime Ç…ÅAÉtÉ@ÉCÉãÇå©Ç¬ÇØéüëÊåüçıÇèIóπÇ∑ÇÈÇÊǧDžéwé¶Ç∑ÇÈÇΩÇflÇ…
                           kQTDontLookForMovieImporterIfGraphicsImporterFound ÇéwíËÇ∑ÇÈÅB
                           ÉtÉ@ÉCÉãÇÅAÉOÉâÉtÉBÉbÉNÉXÉCÉìÉ|Å[É^ÇégǡǃäJÇØÇÈÇ©ÅAÉÄÅ[ÉrÅ[ÇΔǵǃäJÇØÇÈÇ©ÇÕñ‚ÇÌǻǢ */
                       kQTDontLookForMovieImporterIfGraphicsImporterFound
                       );
                if ( err != noErr ) goto BailWithError;
                if ((outCanOpenWithGraphicsImporter) || (outCanOpenAsMovie))
                {
                    /* ê¨å˜ÅBÉtÉ@ÉCÉãÇÕÅAÉOÉâÉtÉBÉbÉNÉXÉCÉìÉ|Å[É^Ç‹ÇΩÇÕÉÄÅ[ÉrÅ[ÉCÉìÉ|Å[É^ÇÃ
                    Ç«ÇøÇÁÇ≈LJäJÇØÇÈ */
                    showItem = true;
                }
            }
        }
    }
    return (showItem);
BailWithError:
    return( false );
}

ÉäÉXÉg 1Å@ CanQuickTimeOpenFile ä÷êîÇégǡǃÉtÉ@ÉCÉãÇÉtÉBÉãÉ^èàóùÇ∑ÇÈÅA ÉAÉvÉäÉPÅ[ÉVÉáÉìíËã`ÇÃÉiÉrÉQÅ[ÉVÉáÉìÉTÅ[ÉrÉXÉtÉBÉãÉ^ä÷êîÇÃó·



éQçlï∂å£ÅF

CanQuickTimeOpenFile Ç…ä÷Ç∑ÇÈï∂å£Ç…ǬǢǃÇÕÅAà»â∫ÇÃÉAÉhÉåÉXÇà QuickTime ÉIÉìÉâÉCÉìï∂èëÇéQèΔǵǃÇ≠ÇæÇ≥Ç¢ÅB
http://developer.apple.com/techpubs/quicktime/qtdevdocs/APIREF/SOURCESI/canquicktimeopenfile.htm


[2002 îN 6 åé 15 ì˙]